package com.sky.test;



import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;

/**
 * 可以读取实体类中的属性,将其转换为SQL语句[如insert into employee(..) values(..)]
 * 内部employee(..) 和 values(..)中的字符串,
 * @author lwl
 * @create 2023/5/24 16:02
 */
public class SQLValueAndColumnUtil {

    /**
     * @param clazz 需要读取的类
     * @param prefix value拼接的前缀 可为null
     * @param ignoreVar 忽视的属性 可为null
     * @param isFile 是否要生成文件 可为null
     * @param pathParam 文件路径 可为null
     */
    public static void convert(Class clazz, String prefix, List<String> ignoreVar,boolean isFile,String pathParam) {
        if(clazz == null){
            throw new RuntimeException("Class不能为空");
        }
        String columns = "";
        String values = "";
        Boolean flag = null;
        try {
            Field[] fields = clazz.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                flag = true;
                Field field = fields[i];
                if (!Modifier.isStatic(field.getModifiers()) && Modifier.isPrivate(field.getModifiers())) {
                    if (ignoreVar != null && ignoreVar.size() != 0) {
                        for(String var:ignoreVar){
                            if (var.equalsIgnoreCase(field.getName())) {
                                flag = false;
                            }
                        }
                    }
                    if (flag) {
                        //column字符串的生成
                        columns += changeCapital(field.getName());
                        if (i < fields.length - 1) {
                            columns += ",";
                        }
                        //value字符串的生成
                        //获取类中private修饰的成员变量
                        prefix = prefix == null?"":prefix;
                        String separator = "".equals(prefix) ? "":".";
                        values += "#{" + prefix + separator + field.getName() + "}";
                        if (i < fields.length - 1) {
                            values += ",";
                        }
                    }
                }
            }
            if(isFile){
                //需要写在文件下
                String path = pathParam == null || "".equals(pathParam)?"D:\\SQLValueAndColumnUtil.txt":pathParam;
                BufferedWriter bw = new BufferedWriter(new FileWriter(new File(path),true));
                bw.write(clazz.getName()+"-columns:");
                bw.write(columns,0,columns.length());
                bw.write("\r\n");
                bw.write(clazz.getName()+"-values:");
                bw.write(values,0,values.length());
                bw.write("\r\n");
                bw.flush();
                bw.close();
            }
            System.out.println("columns = " + columns);
            System.out.println("values = " + values);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param origin 原始字符串
     * @return 大写字母转为小写并加上_
     * @throws Exception
     */
    public static String changeCapital(String origin) throws Exception {
        Class<? extends String> aClass = origin.getClass();
        Field value = aClass.getDeclaredField("value");
        value.setAccessible(true);  //可访问私有属性
        char[] value_char = (char[]) value.get(origin);
        String temp = "";
        for (char val : value_char) {
            temp += Character.isUpperCase(val) ? "_" + Character.toLowerCase(val) : val;

        }

        return temp;
    }


}
